package com.rickpan.service;

import com.rickpan.dto.contacts.*;
import com.rickpan.dto.request.CreateFriendGroupRequest;
import com.rickpan.dto.response.FriendGroupResponse;
import com.rickpan.entity.FriendRelationship;
import com.rickpan.entity.FriendRequest;
import com.rickpan.entity.UserPrivacySettings;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 联系人服务接口
 * 
 * 提供好友关系管理、好友申请处理、用户搜索等核心功能
 */
public interface ContactService {

    // ==================== 好友关系管理 ====================

    /**
     * 获取用户的好友列表
     * 
     * @param userId 用户ID
     * @param group 好友分组（可选）
     * @param keyword 搜索关键词（可选）
     * @return 联系人列表响应
     */
    ContactsListResponse getFriendsList(Long userId, String group, String keyword);

    /**
     * 获取用户的好友列表（分页）
     * 
     * @param userId 用户ID
     * @param group 好友分组（可选）
     * @param keyword 搜索关键词（可选）
     * @param pageable 分页参数
     * @return 好友列表分页结果
     */
    Page<FriendResponse> getFriendsPage(Long userId, String group, String keyword, Pageable pageable);

    /**
     * 获取用户的在线好友列表
     *
     * @param userId 用户ID
     * @return 在线好友列表
     */
    List<FriendResponse> getOnlineFriends(Long userId);

    /**
     * 获取好友在线状态
     *
     * @param userId 用户ID
     * @return 好友在线状态信息
     */
    Map<String, Object> getFriendsOnlineStatus(Long userId);

    /**
     * 更新好友信息（分组、备注）
     * 
     * @param userId 当前用户ID
     * @param relationshipId 好友关系ID
     * @param request 更新请求
     * @return 更新后的好友信息
     */
    FriendResponse updateFriend(Long userId, Long relationshipId, UpdateFriendRequest request);

    /**
     * 删除好友关系
     * 
     * @param userId 当前用户ID
     * @param relationshipId 好友关系ID
     */
    void deleteFriend(Long userId, Long relationshipId);

    /**
     * 检查两个用户是否为好友
     * 
     * @param userId1 用户1 ID
     * @param userId2 用户2 ID
     * @return 是否为好友关系
     */
    boolean areFriends(Long userId1, Long userId2);

    /**
     * 获取用户的好友分组列表
     *
     * @param userId 用户ID
     * @return 分组名称列表
     */
    List<String> getFriendGroups(Long userId);

    /**
     * 获取用户的好友分组详细信息
     *
     * @param userId 用户ID
     * @return 分组详细信息列表
     */
    List<FriendGroupResponse> getFriendGroupsDetail(Long userId);

    /**
     * 创建好友分组
     *
     * @param userId 用户ID
     * @param request 创建分组请求
     * @return 创建的分组信息
     */
    FriendGroupResponse createFriendGroup(Long userId, CreateFriendGroupRequest request);

    /**
     * 删除好友分组
     *
     * @param userId 用户ID
     * @param groupId 分组ID
     */
    void deleteFriendGroup(Long userId, Long groupId);

    // ==================== 好友申请管理 ====================

    /**
     * 发送好友申请
     * 
     * @param fromUserId 申请人ID
     * @param request 申请请求
     * @return 申请结果
     */
    FriendRequestResponse sendFriendRequest(Long fromUserId, SendFriendRequestRequest request);

    /**
     * 处理好友申请
     * 
     * @param userId 当前用户ID
     * @param requestId 申请ID
     * @param request 处理请求
     * @return 处理结果
     */
    FriendRequestResponse handleFriendRequest(Long userId, Long requestId, HandleFriendRequestRequest request);

    /**
     * 获取收到的好友申请
     * 
     * @param userId 用户ID
     * @param status 申请状态（可选）
     * @param pageable 分页参数
     * @return 申请列表
     */
    Page<FriendRequestResponse> getReceivedRequests(Long userId, FriendRequest.Status status, Pageable pageable);

    /**
     * 获取发送的好友申请
     * 
     * @param userId 用户ID
     * @param status 申请状态（可选）
     * @param pageable 分页参数
     * @return 申请列表
     */
    Page<FriendRequestResponse> getSentRequests(Long userId, FriendRequest.Status status, Pageable pageable);

    /**
     * 获取待处理的好友申请数量
     * 
     * @param userId 用户ID
     * @return 待处理申请数量
     */
    long getPendingRequestsCount(Long userId);

    /**
     * 检查是否可以发送好友申请
     * 
     * @param fromUserId 申请人ID
     * @param toUserId 目标用户ID
     * @return 是否可以发送申请
     */
    boolean canSendFriendRequest(Long fromUserId, Long toUserId);

    // ==================== 用户搜索 ====================

    /**
     * 搜索用户
     * 
     * @param currentUserId 当前用户ID
     * @param request 搜索请求
     * @return 搜索结果分页
     */
    Page<UserSearchResponse> searchUsers(Long currentUserId, UserSearchRequest request);

    /**
     * 根据用户名精确查找用户
     * 
     * @param currentUserId 当前用户ID
     * @param username 用户名
     * @return 用户信息（如果找到且允许搜索）
     */
    Optional<UserSearchResponse> findUserByUsername(Long currentUserId, String username);

    // ==================== 隐私设置管理 ====================

    /**
     * 获取用户的隐私设置
     * 
     * @param userId 用户ID
     * @return 隐私设置
     */
    PrivacySettingsResponse getPrivacySettings(Long userId);

    /**
     * 更新用户的隐私设置
     * 
     * @param userId 用户ID
     * @param request 更新请求
     * @return 更新后的隐私设置
     */
    PrivacySettingsResponse updatePrivacySettings(Long userId, UpdatePrivacySettingsRequest request);

    /**
     * 初始化用户的默认隐私设置
     * 
     * @param userId 用户ID
     * @return 默认隐私设置
     */
    UserPrivacySettings initializeDefaultPrivacySettings(Long userId);

    // ==================== 业务辅助方法 ====================

    /**
     * 清理过期的好友申请
     * 
     * @return 清理的申请数量
     */
    int cleanupExpiredRequests();

    /**
     * 获取用户的好友统计信息
     * 
     * @param userId 用户ID
     * @return 统计信息（总数、在线数等）
     */
    ContactsStatistics getFriendsStatistics(Long userId);

    /**
     * 联系人统计信息内部类
     */
    class ContactsStatistics {
        private long totalFriends;
        private long onlineFriends;
        private long pendingRequests;
        private long sentRequests;

        // 构造函数和getter/setter方法
        public ContactsStatistics(long totalFriends, long onlineFriends, long pendingRequests, long sentRequests) {
            this.totalFriends = totalFriends;
            this.onlineFriends = onlineFriends;
            this.pendingRequests = pendingRequests;
            this.sentRequests = sentRequests;
        }

        public long getTotalFriends() { return totalFriends; }
        public void setTotalFriends(long totalFriends) { this.totalFriends = totalFriends; }
        public long getOnlineFriends() { return onlineFriends; }
        public void setOnlineFriends(long onlineFriends) { this.onlineFriends = onlineFriends; }
        public long getPendingRequests() { return pendingRequests; }
        public void setPendingRequests(long pendingRequests) { this.pendingRequests = pendingRequests; }
        public long getSentRequests() { return sentRequests; }
        public void setSentRequests(long sentRequests) { this.sentRequests = sentRequests; }
    }
}
